package com.eduagent.xwqeduagent.utils.oj;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * Judge0在线评测系统工具类
 */
public class JudgeUtils {
    private static final Logger logger = LoggerFactory.getLogger(JudgeUtils.class);

    private JudgeUtils() {
        // 工具类，禁止实例化
    }

    /**
     * 对文本进行Base64编码
     * @param text 要编码的文本
     * @return Base64编码后的字符串
     */
    public static String encodeBase64(String text) {
        if (text == null) {
            return null;
        }
        return Base64.getEncoder().encodeToString(text.getBytes(StandardCharsets.UTF_8));
    }

    /**
     * 对Base64编码的文本进行解码
     * @param base64Text Base64编码的文本
     * @return 解码后的字符串
     */
    public static String decodeBase64(String base64Text) {
        if (base64Text == null) {
            return null;
        }
        return new String(Base64.getDecoder().decode(base64Text), StandardCharsets.UTF_8);
    }

    /**
     * 创建包含多个文件的ZIP归档，并返回Base64编码的字符串
     * @param mainFileName 主文件名
     * @param mainContent 主文件内容
     * @param additionalFiles 附加文件名和内容的映射
     * @return Base64编码的ZIP归档
     * @throws IOException 如果创建ZIP归档失败
     */
    public static String createArchive(String mainFileName, String mainContent, Map<String, String> additionalFiles) throws IOException {
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
             ZipOutputStream zos = new ZipOutputStream(baos)) {
            
            // 添加主文件
            ZipEntry mainEntry = new ZipEntry(mainFileName);
            zos.putNextEntry(mainEntry);
            zos.write(mainContent.getBytes(StandardCharsets.UTF_8));
            zos.closeEntry();
            
            // 添加附加文件
            for (Map.Entry<String, String> file : additionalFiles.entrySet()) {
                ZipEntry entry = new ZipEntry(file.getKey());
                zos.putNextEntry(entry);
                zos.write(file.getValue().getBytes(StandardCharsets.UTF_8));
                zos.closeEntry();
            }
            
            // 完成ZIP并进行Base64编码
            zos.finish();
            return Base64.getEncoder().encodeToString(baos.toByteArray());
        } catch (IOException e) {
            logger.error("创建ZIP归档失败", e);
            throw new IOException("创建多文件归档失败: " + e.getMessage(), e);
        }
    }
} 